package com.zoe.thread.th05_多线程锁的8个问题;

import java.util.concurrent.TimeUnit;

/**
 * @Author Zoe
 * @Date: 2021/05/02
 * @Description
 */
class Phone {
    public static synchronized void sendEmail() {
        try {
            Thread.sleep(4000L);
//            wait(4000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发邮件A");
    }

    public static synchronized void sendMSG() {
        System.out.println("发短信B");
    }

    public void hello() {
        System.out.println("HELLO");
    }
}

/**
 *  关于同步方法的总结：
 *  1. 同步方法仍然涉及到同步监视器，只是不需要我们显式的声明。
 *  2. 非静态的同步方法，同步监视器是：this   Object
 *     静态的同步方法，同步监视器是：当前类本身this.Class
 *
 * 多线程8锁；
 * 1: 标准访问，请问先打印邮件还是短信   A  B
 *
 * 2: 邮件方法sleep4s，请问先打印邮件还是短信 A B  sleep：拿着锁睡觉
 *
 * 3: 邮件方法wait4s，请问先打印邮件还是短信 B A   wait：放开锁睡觉
 *
 * 4: 新增一个普通hello方法，先邮件还是hello？    hello   A
 *
 * 5: 2部手机，请问先打印邮件还是短信    B  A
 *
 * 6: 2个静态同步方法，同一部手机，先邮件还是短信   A  B
 *
 * 7: 2个静态同步方法，2手机，先邮件还是短信   A  B
 *
 * 8: 1个普通同步方法发短信；1个静态同步方法发邮件；1部手机；邮件/短信？  B  A
 *
 * 9: 1个普通同步方法发短信；1个静态同步方法发邮件；2部手机；邮件/短信？  B  A
 *
 */
public class Lock8 {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Phone phone1 = new Phone();
        new Thread(() -> {

            phone.sendEmail();
        }, "A").start();

        try {
            TimeUnit.MILLISECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        new Thread(() -> {
//             phone.sendMSG();
//            phone.hello();
            phone1.sendMSG();
        }, "B").start();
    }
}
